#  代聪聪 第一类客户
#  test
'''
不需要多线程实现
登录过程即Kerberos认证过程：
与AS连接交互之后关闭socket->与TGS连接交互之后关闭socket->与登录上V，获得session key，关闭socket
注册过程只与AS有关，与AS连接之后发送身份信息，收到回复之后关闭socket
登录之后实现各种功能，只有刷新商品时需要再连接V
'''

#  ==================================================
#  客户类
#  ==================================================
import socket
import threading
import tkinter as tk
import tkinter.messagebox
from tkinter import *
from tkinter import ttk

class Customer:
    #  用户id。登陆密码，姓名，性别，地址，电话，余额
    def __init__(self, id:str, password:str, name, sex, address, phonenumber, money):
        self.id = id
        self.password = password
        self.name = name
        self.sex = sex
        self.address = address
        self.phonenumber = phonenumber
        self.money = money

        '''
        登录时：
        有一个问题：当用户把信息发给AS之后，获得的试访问TGS的票据TGT。
        此时用户发送的消息是不需要密码的，
        只有个人信息，表示是本人，那么应该包含哪些有用信息？
        连接AS和TGS的函数参数考虑为？
        '''

    # 请求AS认证，将身份信息发给AS
    def connect_as(self, id:str, password:str):
        #  连接AS
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('127.0.0.1', 6666))
        '''self.id = input('请输入用户id：')
        self.password = input('输入密码：')'''
        #  开始连接AS地址
        if s is None:
            print("无法连接到AS服务器 ！\n")
        else:
            print("连接到AS服务器 ！\n")
            #  将身份信息发给AS
            s.send(1024)
            tgt = 'k'  # s.recv(1024)
            if tgt is None:
                print('AS认证失败！\n')
            else:
                print('AS认证成功！\n')
                return tgt
        s.close()

    #  拿上（TGT）去找TGS

    def connect_tgs(self, tgt:str):
        # 连接TGS
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('127.0.0.1', 6666))
        # 开始连接AS地址
        if s is None:
            print("无法连接TGS服务器！\n")
        else:
            print("连接到TGS服务器！ \n")
            # 将tgt发给TGS
            self.tgt = 'k'  # connect_as()
            s.send(tgt)
            st = s.recv(1024)
            if st is None:
                print('tgt票据获取失败！\n')
            else:
                print('tgt票据获取成功！\n')
                return st
        s.close()

    def connect_v(self, st):
        # 连接到V
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('127.0.0.1', 6666))
        if s is None:
            print('无法连接到服务器！ \n')
        else:
            print('连接到服务器 \n')
            # 将st发给服务器
            self.st = 'k'
            s.send(st)
            reply = s.recv(1024)
            if reply is None:
                print('登录失败！ \n')
            else:
                print('登录成功 \n')
                return reply
        s.close()


    def signature(self,id: str, password, name: str, sex: str,
                      address: str, phonenumber:str, money: 0, TGT, ST:str):
        #  注册时向AS发送身份信息
        #  连接AS
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('127.0.0.1', 6666))
        if s is None:
            print("无法连接到AS服务器 ！\n")
        else:
            print("连接到AS服务器 ！\n")
            #  将身份信息发给AS
            s.send(1024)
            reply = s.recv(1024)  # 包含客户的身份信息
            if reply is None:
                print('注册失败！ \n')
            else:
                print('注册成功！ \n')
        s.close()



        ''''''
    def __if__legal(self, password1: str, password2: str, name: str, sex: str):
        ''''''
    def log_in(self, id_lg, pwd_lg):
        '''
        与AS连接交互->与TGS连接交互->登录上V，获得session key
        '''

        tgt = self.connect_as(id_lg, pwd_lg)
        st = self.connect_tgs(tgt)
        sk = self.connect_v(st) # 获得一个会话密钥
        return sk
        #  登陆成功之后取消隐藏根界面，进入功能界面


    def alter_info(self, password1: str, password2: str, name: str, sex: str,
                    address: str, phonenumber: str):
        ''''''
    def add_money(self, money: float, password: str):
        ''''''
    def show_dish_re(self):
        ''''''
    def submit_order(self):
        ''''''
    def check_order(self, oid: str):
        ''''''

'''
#  ===================================================
#  窗口
#  ===================================================
# 根界面
main_win = tk.Tk()
main_win.title('用户点餐系统')
main_win.geometry('500x400')
main_win.withdraw()   # 隐藏

tk.Label(main_win, text='用户名:').place(x=20, y=20)
tk.Label(main_win, text='余  额:').place(x=60, y=20)
# 登录界面


login_win = tk.Toplevel(main_win)  # 在主界面的上层显示
login_win.title('客户登录')
login_win.geometry('350x350+300+300')

#  登录：用户名、密码
tk.Label(login_win, text='用户名').place(x=60, y=100)
username = tk.Entry(login_win)
username.place(x=130, y=100)

tk.Label(login_win, text='密  码').place(x=60, y=150)
password = tk.Entry(login_win, show='*')
password.place(x=130, y=150)

#  按钮布置：登录、注册、退出
my_customer = Customer
tk.Button(login_win, text='登录', command=my_customer.log_in).place(x=100, y=200)
tk.Button(login_win, text='注册', command=my_customer.signature).place(x=200, y=200)'''

#  =================================================
#  运行
#  =================================================
if __name__ == '__main__':
    my_customer = Customer('','','','','','','')
    while True:
        print('0、登录  1、注册 \n')
        opt = input('请输入选项：\n')
        if opt == 0:
            id_lg = input('请输入用户id：')
            pwd_lg = input('输入密码：')
            my_customer.log_in(id_lg, pwd_lg)
            break
        elif opt == 1:
            '''input something'''
            my_customer.signature('s','o','m','e','t','h','i','n','g')
            break
        else:
            print('错误')
            break